perm filename PLAY.FAI[CMS,LCS] blob sn#254475 filedate 1976-12-11 generic text, type T, neo UTF8
00100		TITLE	SOUND;  DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
00200	
00300	;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
00400	;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
00500	;  
00600	;  NAME OF THE FILE TO BE INPUTTED IS 'MUSIC.MUS' OR 'MUSAA.DMD',
00700	;  THE FIRST RECORD OF WHICH CONTAINS THE
00800	;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
00900	
01000	ENTRY PLAY
01100	EXTERN JOBREL
01200	A   ←   1     ;WORK
01300	B   ←   2     ;WORK
01400	RET ←   3     ;RETURN ACCUMULATOR
01500	T1  ←   4     ; TEMP FOR ADSMAP (JAM)
01600	;;BUFSIZ ←=20224   ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!	
01700	BUFSIZ ←4400*3	;OPTIMIZED FOR 3330 DSK. (←4400*3 IN SYS VERSION)
01800	↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
01900	↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT
02000	
02100		OPDEF	READCH [51B8]
02200	        OPDEF   MESSAGE[51B8!3B12]
02300	
02400	PLAY:	0
02500	BEG:	;CALLI	0,0         ;RESET I/O DEVICES
02600	 	OPEN 	DSKCHN,[17  ;MODE
02700			'DSK   '    ;DEVICE NAME
02800	 		0]          ;NO BUFFER HEADERS
02900		HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE
03000	
03100		MOVE 6,['MUSAA ']
03200		MOVE 7,['DMD   ']
03300	 	SETZM	DIR2+3    ;FOR RESTART
03400	 	SETZM	DIR+3    ;FOR RESTART
03500	;	OUTSTR[ASCIZ/FILE NAME -- /]  ;READS '.DMD' FILES ONLY.
03600	;	SETZM DIR+1
03700	;	SETZM DIR
03800	;	SETO 5,		;FLAG FOR EXTENSIONS
03900	;	MOVE  2,[POINT 6,DIR]
04000	;	JRST GOT
04100	;EXT:	MOVE 2,[POINT 6,DIR+1]
04200	;	SETZ 5,
04300	;GOT:	INCHWL	1
04400	;	CAIN  1,15	; A CR?
04500	;	JRST  GOT
04600	;	CAIGE	1,60		; CHECKS FOR GOOD CHARS.
04700	;	JRST	LX  
04800	;	SUBI	1,40
04900	;	IDPB	1,2
05000	;	JRST	GOT
05100	;LX:	JUMPE 5,LZ
05200	;	SKIPN DIR
05300		MOVEM 6,DIR
05400	;	CAIN  1,56 	; 56='.'
05500	;	JRST EXT
05600	;	JRST MESS
05700	;LZ:	SKIPN DIR+1
05800		MOVEM 7,DIR+1
05900	
06000	
     

00100		;FIND OUT NUMBER OF CHANNELS AND THE SPEED.
00200	MESS:	MESSAGE	[ASCIZ/  HOW MANY CHANNELS? /]
00300		READCH	A
00400		SUBI	A,"0"		;CONVERT TO BINR
00500		DPB	A,[POINT 2,DACPAR,35]
00600	
00700	SPD:	MESSAGE [ASCIZ/  SPEED? /]
00800		READCH  A
00900		CAIN	A,"X"
01000		JRA	16,1(16)
01100		CAIG A,"5"		;IS IT 1 - 5?
01200		JRST SPD2		;YES
01300		SKIPN DIR+3		;IS THIS THE 1ST TIME THRU?
01400		JRST SPD		;YES, SO WE NEED A GOOD NUM.
01500		JRST PLA2 		;ANYTHING ELSE WILL REPLAY
01600	
01700	SPD2:	SUBI	A,"0"
01800		DPB	A,[POINT 3,DACPAR,26]
01900	
02000	PLA2:	SETZM DIR+3
02100		SETZM DIR2+3
02200		MOVE 5,DMD		;GET 'DMD   '
02300		LOOKUP	DSKCHN,DIR   
02400		SKIPA			;CAN'T FIND MUSAA.DMD
02500		JRST XOPEN		;FOUND IT
02600		CAMN 5,DIR+1		;IS DIR+1='DMD   '?
02700		JRST MUS		;YES, GO LOOK FOR MUSIC.MUS
02800		MOVEM 5,DIR+1
02900		JRST PLA2		;TRY IT WITH 'DMD   '
03000	MUS:	LOOKUP  DSKCHN,DIR2	;TRY FOR MUSIC.MUS
03100	
03200		JRST	[MESSAGE[ASCIZ/
03300			*** MUSIC FILE NOT FOUND/]
03400			CALLI  12]
03500	        ;EXIT IF FILE IS MISSING
03600		MOVE A,DIR2+3	;GET LENGTH OF MUSIC.MUS
03700		MOVEM A,DIR+3;PUT IT IN RIGHT PLACE
03800	
03900	XOPEN:	OPEN	ADCHN,[117 	;MODE
04000	         	'DAC   '        ;DEVICE NAME
04100	 		0]              ;NO BUFFER HEADERS
04200	
04300	  	JRST	[MESSAGE[ASCIZ/
04400			***D-A NOT AVAILABLE/]
04500			CALLI  12]
04600		;EXIT IF D-A IS UNAVAILABLE
04700		MTAPE ADCHN,DACPAR
04800	
04900	XGPOK:	MOVSI	'XGP'	;DOWN TO SPWAR FOR XGP CONFLICT.
05000		DEVUSE	0,	
05100		HLRZ 	0,0
05200		CAIN	400000
05300		JRST	SPWAR
05400		INIT	16,17
05500		SIXBIT	.XGP.
05600		0
05700		JRA	16,2(16)
05800	
05900	SPWAR:	HRRZ	A,JOBREL
06000		HRRZM	A,OLDREL#
06100		HRRZM	A,BUF1
06200		HRRZI	A,1(A)
06300		HRRM	A,HEADER
06400		ADDI	A,BUFSIZ
06500		HRRZM	A,BUF2
06600		ADDI	A,BUFSIZ+1
06700		HRRZM	A,BUF3
06800		ADDI	A,BUFSIZ+2
06900		CORE	A,
07000		JRST	[OUTSTR[ASCIZ/
07100		CAN'T GET CORE!
07200	/]↔	JRA	16,(16)]
07300	
07400		LOCK A,			;SPWAR:
07500	;;	SPCWAR 17,[CALLI]
07600		MESSAGE [ASCIZ/ GO? /]
07700		READCH A
07800		; READS TO FIND (AND IGNORE) HEADER.(1ST REC.)
07900		INPUT DSKCHN,HEADER
08000		HRRZ A,@BUF1
08100		CAIE A,525252	; LOOKS FOR MAGIC NUMBER.
08200		USETI DSKCHN,1	; NO HEADER, SO START AT BEGINNING.
08300	
08400	
08500	LNTH:	movs a,DIR+3		;get length of file.
08600		movnm a,nwd
08700	;-----------------------------------------------------
08800	
     

00100		;BEGIN MAIN BODY OF PROGRAM
00200	
00300		MOVE T1,[647003,,0]
00400		ADSMAP T1,	; SET AUDIO SWITCH TEMPORARILY TO DAC (JAM 7/24/75)
00500				; THE OPTIONS WE ASKED FOR ARE TEMPORARY, WAKT FOR
00600				; PAGE TO FINISH, DON'T INTERRUPT WITH MORE PAGES,
00700				; DELAY BEEPS TO END OF XFR.
00800		OUTSTR [ASCIZ /
00900	TO DAC . . ./]
01000	LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
01100	BUF1:	0
01200	;	BUF1-1 			;USE BUF1 FOR THE I/O
01300		JUMPLE	B,OUT    	;DONE
01400		
01500		JSP RET,SUB
01600	BUF2:	0
01700	;	BUF2-1
01800		JUMPLE B,OUT
01900	
02000		JSP	RET,SUB		;CALL IT AGAIN
02100	BUF3:	0
02200	;	BUF3-1			;USE BUF3 FOR THE I/O
02300		JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0
02400	
02500	OUT:	close dskchn,		;END OF PROGRAM.
02600		releas adchn,
02700		OUTSTR [ASCIZ / DONE!
02800	/]
02900		SETO T1,
03000		ADSMAP T1,	; RESET AUDIO SWITCH CONNECTION TO PERMANENT (JAM 7/24/75)
03100	;;	SPCWAR 0,'SSW'
03200		UNLOCK
03300		RELEASE 16,
03400		HRRZ	A,OLDREL
03500		CORE	A,
03600		JRST [OUTSTR[ASCIZ/DONK??!!/]↔JRA 16,(16)]
03700		jrst SPD
03800	
03900		;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
04000		;  1(RET) WILL BE THE RETURN
04100		;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
04200		;         PUT IN THE RIGHT HALF OF THE IOWD.
04300		;  A      WILL BE A WORK REGISTER
04400	    	;  B      WILL BE TESTED ON THE OUTSIDE.
04500	
04600	SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
04700		ADDB	A,NWD		;A←NWD-BUFSIZ
04800					;NWD←NWD-BUFSIZ
04900		MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
05000					;TIME.
05100		JUMPL	A,LAST		;SET UP FOR LAST TIME.
05200		MOVEI	A,0		
05300	
05400		;THE IOWD LOOKS LIKE:
05500		;  [-BUFSIZ / BUFI-1]
05600	
05700	LAST:	ADDI	A,BUFSIZ
05800		MOVNS	A		;COMPLEMENT A
05900		HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
06000					;TO THE LEFT SIDE OF A.
06100		MOVSM	A,INLIST	;SWAP A AND MOVE IT.
06200		MOVSM	A,OUTWC		;SAME FOR OUTPUT.
06300		INPUT	DSKCHN,INLIST	;READ A RECORD.
06400		OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
06500		JRST	1(RET)		;RETURN
06600	;---------------------------------------------------------
06700	
06800	; STORAGE:
06900	
07000	NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
07100	;↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
07200	;BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2
07300	;BUF3:	BLOCK	BUFSIZ+1	;BUFFER 3
07400	DMD:	'DMD   '
07500	DIR2: 'MUSIC '		;FILENAME FOR INPUT
07600		'MUS   '			;EXTENSION
07700		0			;INFORMATION ON FILE
07800		0			;PROJECT PROG#
07900	DIR:	0    			;NAME
08000		0			;EXTENSION
08100		0			;INFORMATION ON FILE
08200		0			;PROJECT PROG#
08300	CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
08400		0
08500	INLIST:	0			;WILL CONTAIN AN IOWD
08600		0
08700	HEADER:	IOWD =128,BUF1
08800		0
08900	OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
09000	;;	3650			;MAGIC BITS FOR 136.
09100	OUTBIT: 4000			;BITS FOR D-A
09200		BLOCK	2
09300	DACPAR:	1001		;SPEED 0=6.4K, 1=12.8, 2=25.6, 3=51.2, 4=102.4, 5=
09400		0
09500		0
09600	
09700	
09800	A←1
09900	B←2
10000	D←3
10100	
10200	ichn←adchn
10300	
10400	END